NFT๋ฅผ ์ํ ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ๋ณต์ก์ฑ์ ํ๊ตฌํฉ๋๋ค. ์ํคํ ์ฒ, ๊ตฌํ, ๋ณด์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก์ ๋ํด ์์๋ณด์ธ์.
NFT ์ค๋งํธ ๊ณ์ฝ: ERC-721 ๊ตฌํ ์ฌ์ธต ๋ถ์
๋์ฒด ๋ถ๊ฐ๋ฅํ ํ ํฐ(NFT)์ ๋ธ๋ก์ฒด์ธ ์์์ ๊ณ ์ ํ ์์ดํ ์ ํํ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๋์งํธ ์์ฐ ํ๊ฒฝ์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. ๋๋ถ๋ถ์ NFT์ ํต์ฌ์๋ ์ด๋ฌํ ํ ํฐ์ด ์์ฑ, ๊ด๋ฆฌ ๋ฐ ์ ์ก๋๋ ๋ฐฉ์์ ๊ท์ ํ๋ ์ผ๋ จ์ ๊ท์น์ธ ERC-721 ํ์ค์ด ์์ต๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ์ํคํ ์ฒ, ๊ตฌํ ์ธ๋ถ ์ ๋ณด, ๋ณด์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก์ ๋ํ ์ฌ์ธต์ ์ธ ํ๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ERC-721์ด๋ ๋ฌด์์ธ๊ฐ?
ERC-721์ ์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ์์ ๋์ฒด ๋ถ๊ฐ๋ฅํ ํ ํฐ์ ๋ํ๋ด๊ธฐ ์ํ ํ์ค์ ๋๋ค. ๋ชจ๋ ํ ํฐ์ด ์๋ก ๋์ผํ๋ค๋ ์๋ฏธ์ ๋์ฒด ๊ฐ๋ฅํ(fungible) ERC-20 ํ ํฐ๊ณผ ๋ฌ๋ฆฌ, ERC-721 ํ ํฐ์ ๊ณ ์ ํฉ๋๋ค. ๊ฐ ํ ํฐ์ ๊ณ ์ ํ ID๋ฅผ ๊ฐ์ง๊ณ ์์ด, ๊ณ ์ ํ ๋์งํธ ๋๋ ๋ฌผ๋ฆฌ์ ์์ฐ์ ์์ ๊ถ์ ๋ํ๋ด๋ ๋ฐ ์ ํฉํฉ๋๋ค.
ERC-721 ํ ํฐ์ ์ฃผ์ ํน์ง:
- ๋์ฒด ๋ถ๊ฐ๋ฅ์ฑ(Non-Fungible): ๊ฐ ํ ํฐ์ ๊ณ ์ ํ๋ฉฐ ๋ค๋ฅธ ํ ํฐ๊ณผ ๊ตฌ๋ณ๋ฉ๋๋ค.
- ๊ณ ์ ์๋ณ(Unique Identification): ๊ฐ ํ ํฐ์ ๊ณ ์ ํ ID๋ฅผ ๊ฐ์ง๋๋ค.
- ์์ ๊ถ ์ถ์ (Ownership Tracking): ํ์ค์ ๊ฐ ํ ํฐ์ ์์ ๊ถ์ ์ถ์ ํฉ๋๋ค.
- ์๋ ๊ฐ๋ฅ์ฑ(Transferability): ํ ํฐ์ ํ ๊ณ์ ์์ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ์ ์ก๋ ์ ์์ต๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ(Metadata): ํ ํฐ์ ๋ฉํ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ํ ํฐ์ด ๋ํ๋ด๋ ์์ฐ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
ERC-721 ์ค๋งํธ ๊ณ์ฝ ์ํคํ ์ฒ
ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ERC-721 ํ์ค์ ๊ตฌํํ๋ ์๋ฆฌ๋ํฐ(Solidity) ํ๋ก๊ทธ๋จ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํฉ๋๋ค:
ํต์ฌ ํจ์:
- balanceOf(address _owner): ์ฃผ์ด์ง ์ฃผ์๊ฐ ์์ ํ ํ ํฐ์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
- ownerOf(uint256 _tokenId): ํน์ ํ ํฐ ์์ ์์ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค.
- transferFrom(address _from, address _to, uint256 _tokenId): ํ ํฐ์ ์์ ๊ถ์ ํ ์ฃผ์์์ ๋ค๋ฅธ ์ฃผ์๋ก ์ด์ ํฉ๋๋ค. ์์ ์๊ฐ ์์ํ์ง ์์ ๊ฒฝ์ฐ ์น์ธ์ด ํ์ํฉ๋๋ค.
- approve(address _approved, uint256 _tokenId): ๋ค๋ฅธ ์ฃผ์๊ฐ ํน์ ํ ํฐ์ ์์ ๊ถ์ ์ด์ ํ ์ ์๋๋ก ์น์ธํฉ๋๋ค.
- getApproved(uint256 _tokenId): ํน์ ํ ํฐ์ ์์ ๊ถ ์ด์ ์ ์น์ธ๋ฐ์ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค.
- setApprovalForAll(address _operator, bool _approved): ์ด์์๊ฐ ํธ์ถ์๊ฐ ์์ ํ ๋ชจ๋ ํ ํฐ์ ๊ด๋ฆฌํ ์ ์๋๋ก ํ์ฑํ ๋๋ ๋นํ์ฑํํฉ๋๋ค.
- isApprovedForAll(address _owner, address _operator): ์ด์์๊ฐ ํน์ ์ฃผ์๊ฐ ์์ ํ ๋ชจ๋ ํ ํฐ์ ๊ด๋ฆฌํ๋๋ก ์น์ธ๋์๋์ง ํ์ธํฉ๋๋ค.
๋ฉํ๋ฐ์ดํฐ ํ์ฅ (์ ํ ์ฌํญ):
- name(): ํ ํฐ ์ปฌ๋ ์ ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
- symbol(): ํ ํฐ ์ปฌ๋ ์ ์ ์ฌ๋ณผ์ ๋ฐํํฉ๋๋ค.
- tokenURI(uint256 _tokenId): ํน์ ํ ํฐ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ JSON ํ์ผ์ ๊ฐ๋ฆฌํค๋ URI๋ฅผ ๋ฐํํฉ๋๋ค. ์ด URI๋ ๋ณดํต IPFS(InterPlanetary File System) ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ด๊ฑฐ ํ์ฅ (์ ํ ์ฌํญ):
- totalSupply(): ์กด์ฌํ๋ ์ด ํ ํฐ ์๋ฅผ ๋ฐํํฉ๋๋ค.
- tokenByIndex(uint256 _index): ๊ณ์ฝ์ ์ ์ฅ๋ ๋ชจ๋ ํ ํฐ ์ค ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์๋ ํ ํฐ ID๋ฅผ ๋ฐํํฉ๋๋ค.
- tokenOfOwnerByIndex(address _owner, uint256 _index): ํน์ ์ฃผ์๊ฐ ์์ ํ ํ ํฐ ์ค ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์๋ ํ ํฐ ID๋ฅผ ๋ฐํํฉ๋๋ค.
OpenZeppelin์ผ๋ก ERC-721 ์ค๋งํธ ๊ณ์ฝ ๊ตฌํํ๊ธฐ
OpenZeppelin์ ERC-721 ํ ํฐ ๊ฐ๋ฐ์ ๋จ์ํํ๋ ์์ ํ๊ณ ๊ฐ์ฌ๋ ์ค๋งํธ ๊ณ์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. OpenZeppelin์ ERC721 ๊ตฌํ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์ทจ์ฝ์ ์ ๋์ ํ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค. ๋ค์์ OpenZeppelin์ ์ฌ์ฉํ์ฌ ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ๊ตฌํํ๋ ์์ ์ ๋๋ค:
์ฌ์ ์ค๋น ์ฌํญ:
- Node.js ๋ฐ npm: Node.js์ npm์ด ์ค์น๋์ด ์๋์ง ํ์ธํ์ธ์.
- Truffle ๋๋ Hardhat: ์ค๋งํธ ๊ณ์ฝ์ ์ปดํ์ผํ๊ณ ๋ฐฐํฌํ๊ธฐ ์ํ ๊ฐ๋ฐ ํ๊ฒฝ(์: Truffle ๋๋ Hardhat)์ ์ ํํ์ธ์.
- Ganache: ์ด๋๋ฆฌ์ ๊ฐ๋ฐ์ ์ํ ๊ฐ์ธ์ฉ ๋ธ๋ก์ฒด์ธ์ธ Ganache๋ฅผ ์ค์นํ์ธ์.
๋จ๊ณ:
- Truffle ๋๋ Hardhat ํ๋ก์ ํธ ์ด๊ธฐํ:
# Truffle
mkdir my-nft-project
cd my-nft-project
truffle init
# Hardhat
mkdir my-nft-project
cd my-nft-project
npx hardhat
- OpenZeppelin ๊ณ์ฝ ์ค์น:
npm install @openzeppelin/contracts
- ERC-721 ์ค๋งํธ ๊ณ์ฝ ์์ฑ: `contracts` ๋๋ ํ ๋ฆฌ์ ์๋ก์ด ์๋ฆฌ๋ํฐ ํ์ผ(์: `MyNFT.sol`)์ ์์ฑํฉ๋๋ค.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyNFT is ERC721 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
string private _baseURI;
constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
_baseURI = baseURI;
}
function mintNFT(address recipient) public returns (uint256) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, string(abi.encodePacked(_baseURI, Strings.toString(newItemId), ".json")));
return newItemId;
}
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
return string(abi.encodePacked(_tokenURI));
}
mapping (uint256 => string) private _tokenURIs;
function setBaseURI(string memory baseURI) public {
_baseURI = baseURI;
}
// The following functions are overrides required by Solidity.
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
super._beforeTokenTransfer(from, to, tokenId);
}
}
import "@openzeppelin/contracts/utils/Strings.sol";
- ์ค๋งํธ ๊ณ์ฝ ์ปดํ์ผ: Truffle ๋๋ Hardhat์ ์ฌ์ฉํ์ฌ ์ค๋งํธ ๊ณ์ฝ์ ์ปดํ์ผํฉ๋๋ค.
# Truffle
truffle compile
# Hardhat
npx hardhat compile
- ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ: `migrations` ๋๋ `scripts` ๋๋ ํ ๋ฆฌ์ ์๋ก์ด ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ(์: `deploy.js`)์ ์์ฑํฉ๋๋ค.
// Truffle Migration Example
const MyNFT = artifacts.require("MyNFT");
module.exports = async function (deployer) {
await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};
// Hardhat Deployment Script Example
async function main() {
const MyNFT = await ethers.getContractFactory("MyNFT");
const myNFT = await MyNFT.deploy("MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
await myNFT.deployed();
console.log("MyNFT deployed to:", myNFT.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
- ์ค๋งํธ ๊ณ์ฝ ๋ฐฐํฌ: ์ค๋งํธ ๊ณ์ฝ์ ๋ก์ปฌ ๋ธ๋ก์ฒด์ธ(์: Ganache) ๋๋ ํ ์คํธ ๋คํธ์ํฌ(์: Ropsten, Rinkeby)์ ๋ฐฐํฌํฉ๋๋ค.
# Truffle
truffle migrate
# Hardhat
npx hardhat run scripts/deploy.js --network localhost
`ipfs://YOUR_IPFS_CID/`๋ฅผ ์ค์ IPFS CID(์ฝํ ์ธ ์๋ณ์)๋ก ๊ต์ฒดํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด ๊ธฐ๋ณธ URI๋ NFT ๋ฉํ๋ฐ์ดํฐ JSON ํ์ผ์ด ์ ์ฅ๋ ์์น๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
IPFS์ NFT ๋ฉํ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
NFT ๋ฉํ๋ฐ์ดํฐ๋ ๋ธ๋ก์ฒด์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋น์ฉ์ ์ค์ด๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์คํ์ฒด์ธ์ ์ ์ฅ๋ฉ๋๋ค. IPFS(InterPlanetary File System)๋ NFT ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์ ํํ ์ฌ์ฉ๋๋ ๋ถ์ฐํ ์คํ ๋ฆฌ์ง ๋คํธ์ํฌ์ ๋๋ค. ๊ฐ NFT๋ `tokenURI`๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ IPFS ์์ JSON ํ์ผ์ ๊ฐ๋ฆฌํต๋๋ค. ์ด ํ์ผ์๋ ์ด๋ฆ, ์ค๋ช , ์ด๋ฏธ์ง URL ๋ฐ ๊ธฐํ ์์ฑ๊ณผ ๊ฐ์ NFT์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
NFT ๋ฉํ๋ฐ์ดํฐ ์์ (JSON):
{
"name": "My Awesome NFT",
"description": "This is a unique NFT.",
"image": "ipfs://YOUR_IPFS_CID/image.png",
"attributes": [
{
"trait_type": "Background",
"value": "Blue"
},
{
"trait_type": "Character",
"value": "Robot"
}
]
}
`ipfs://YOUR_IPFS_CID/image.png`๋ฅผ ์ค์ ์ด๋ฏธ์ง์ IPFS CID๋ก ๊ต์ฒดํ์ธ์.
IPFS์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ก๋ํ๋ ๋จ๊ณ:
- IPFS ํด๋ผ์ด์ธํธ ์ ํ: IPFS Desktop, Pinata ๋๋ NFT.Storage์ ๊ฐ์ IPFS ํด๋ผ์ด์ธํธ๋ฅผ ์ ํํฉ๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ ์ ๋ก๋: ์ ํํ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ NFT ๋ฉํ๋ฐ์ดํฐ JSON ํ์ผ๊ณผ ์ด๋ฏธ์ง๋ฅผ IPFS์ ์ ๋ก๋ํฉ๋๋ค.
- IPFS CID ์ป๊ธฐ: ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ก๋ํ ํ IPFS CID๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ IPFS์์ ๋ฐ์ดํฐ์ ๋ํ ๊ณ ์ ์๋ณ์์ ๋๋ค.
- ์ค๋งํธ ๊ณ์ฝ ์ ๋ฐ์ดํธ: ์ค๋งํธ ๊ณ์ฝ์ `tokenURI` ํจ์๋ฅผ IPFS CID๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ๋ณด์ ๊ณ ๋ ค ์ฌํญ
ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ๊ฐ๋ฐํ ๋ ๋ณด์์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ค์ํ ๋ณด์ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค:
- ์ฌ์ง์ ๊ณต๊ฒฉ(Reentrancy Attacks): Checks-Effects-Interactions ํจํด์ ์ฌ์ฉํ์ฌ ์ฌ์ง์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ์ํ ๋ณ๊ฒฝ์ ํ๊ธฐ ์ ์ ํ์ธ์ ์ํํ๊ณ , ๊ทธ ๋ค์ ์ํ ๋ณ๊ฒฝ์ ์ ์ฉํ๊ณ , ๋ง์ง๋ง์ผ๋ก ์ธ๋ถ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. OpenZeppelin์ `ReentrancyGuard` ๊ณ์ฝ์ ์ด ์ทจ์ฝ์ ์ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ ์ ์ค๋ฒํ๋ก์ฐ/์ธ๋ํ๋ก์ฐ(Integer Overflow/Underflow): ์ค๋ฒํ๋ก์ฐ/์ธ๋ํ๋ก์ฐ ๊ฒ์ฌ๊ฐ ๋ด์ฅ๋ ์๋ฆฌ๋ํฐ ๋ฒ์ 0.8.0 ์ด์์ ์ฌ์ฉํฉ๋๋ค. ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ OpenZeppelin์ `SafeMath` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ ๊ทผ ์ ์ด(Access Control): ํ ํฐ์ ๋ฐํ, ์๊ฐ ๋๋ ์์ ํ ์ ์๋ ์ฌ๋์ ์ ํํ๊ธฐ ์ํด ์ ์ ํ ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค. OpenZeppelin์ `Ownable` ๋๋ `AccessControl` ๊ณ์ฝ์ ์ฌ์ฉํ์ฌ ์์ ๊ถ ๋ฐ ๊ถํ์ ๊ด๋ฆฌํฉ๋๋ค.
- ์๋น์ค ๊ฑฐ๋ถ(Denial of Service - DoS): ๊ฐ์ค ํ๋ ๋ฌธ์ ์ ๊ฐ์ ์ ์ฌ์ ์ธ DoS ์ทจ์ฝ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ๊ฐ์ค ์๋น๋ฅผ ์ค์ด๊ณ ๊ณ์ฝ์ ์ ์ฌ์ ์ผ๋ก ์ฐจ๋จํ ์ ์๋ ์์ ์ ํผํ๋๋ก ์ฝ๋๋ฅผ ์ต์ ํํ์ธ์.
- ์ ํ ๋งค๋งค(Front Running): ์ปค๋ฐ-๋ฆฌ๋น ๋ฐฉ์์ด๋ ์คํ์ฒด์ธ ์ฃผ๋ฌธ ๋งค์นญ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ ํ ๋งค๋งค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ๊ตฌํํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ(Data Validation): ์๊ธฐ์น ์์ ๋์์ด๋ ๋ณด์ ์นจํด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ฒ์ฆํฉ๋๋ค.
- ์ ๊ธฐ์ ์ธ ๊ฐ์ฌ(Regular Audits): ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํ๊ธฐ ์ํด ํํ์ด ์ข์ ๋ณด์ ํ์ฌ์ ์ํ ์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ๋ฅผ ์ํํฉ๋๋ค.
ERC-721 NFT์ ์ค์ ์ ์ฉ ์ฌ๋ก
ERC-721 NFT๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋ฉ๋๋ค:
- ๋์งํธ ์ํธ: ๊ณ ์ ํ ๋์งํธ ์ํธ์ํฌ์ ์์ ๊ถ์ ๋ํ๋ ๋๋ค. SuperRare, Foundation, Nifty Gateway์ ๊ฐ์ ํ๋ซํผ์ NFT ์ํธ์ ๊ตฌ๋งค ๋ฐ ํ๋งค๋ฅผ ์ด์งํฉ๋๋ค.
- ์์งํ: ํธ๋ ์ด๋ฉ ์นด๋, ๊ฐ์ ์ ์๋๋ฌผ ๋ฐ ๊ธฐํ ์์ดํ ๊ณผ ๊ฐ์ ๋์งํธ ์์งํ์ ๋ง๋ญ๋๋ค. CryptoPunks์ Bored Ape Yacht Club์ ์ฑ๊ณต์ ์ธ NFT ์์งํ ํ๋ก์ ํธ์ ์์ ๋๋ค.
- ๊ฒ์: ๋ฌด๊ธฐ, ์บ๋ฆญํฐ, ํ ์ง์ ๊ฐ์ ๊ฒ์ ๋ด ์์ดํ ์ ๋ํ๋ ๋๋ค. Axie Infinity์ Decentraland๋ NFT๋ฅผ ์ฌ์ฉํ๋ ๋ธ๋ก์ฒด์ธ ๊ฒ์์ ์์ ๋๋ค.
- ๋ถ๋์ฐ: ๋ถ๋์ฐ ์์ฐ์ ์์ ๊ถ์ ํ ํฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ถ ์์ ๊ถ ๋ฐ ์ฌ์ฐ๊ถ์ ์ฉ์ดํ ์ด์ ์ด ๊ฐ๋ฅํด์ง๋๋ค.
- ๊ณต๊ธ๋ง ๊ด๋ฆฌ: ๊ณต๊ธ๋ง์์ ์ ํ์ ์ถ์ฒ์ ์ง์๋ฅผ ์ถ์ ํฉ๋๋ค. ์ด๋ ์์กฐ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ ํ์ง์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํฐ์ผํ : ์ด๋ฒคํธ, ์ฝ์ํธ ๋ฐ ๊ธฐํ ํ๋์ ๋ํ ํฐ์ผ์ ๋ฐํํฉ๋๋ค. NFT๋ ํฐ์ผ ์ฌ๊ธฐ๋ฅผ ๋ฐฉ์งํ๊ณ ๋ ์์ ํ๊ณ ํฌ๋ช ํ ํฐ์ผํ ์์คํ ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ ์ ๊ด๋ฆฌ: ๋์งํธ ์ ์ ๋ฐ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ ๋๋ค. ์ด๋ ๊ฐ์ธ์ด ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ํต์ ํ๊ณ ์ ์ ๋์ฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ตญ์ ์ ์ฌ๋ก:
- ๋์งํธ ์ํธ: ์ ์ธ๊ณ์ ์ํฐ์คํธ๋ค์ด ์ผ๋ณธ ์ ๋๋ฉ์ด์ , ์ํ๋ฆฌ์นด ๋ถ์กฑ ์์ , ์ ๋ฝ ๊ณ ์ ํํ์์ ์๊ฐ์ ๋ฐ์ ์ํ์ ํฌํจํ์ฌ ์์ ์ ๋์งํธ ์ํธ์ํฌ๋ฅผ ํ๋งคํ๊ธฐ ์ํด NFT ํ๋ซํผ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- ๊ฒ์: Axie Infinity์ ๊ฐ์ ๋ธ๋ก์ฒด์ธ ๊ฒ์์ ๋๋จ์์์์์ ์ธ๊ธฐ๋ฅผ ์ป์์ผ๋ฉฐ, ํ๋ ์ด์ด๋ค์ ๊ฒ์์ ํ๊ณ NFT๋ฅผ ๊ฑฐ๋ํ์ฌ ์์ ์ ์ป์ต๋๋ค.
- ๋ถ๋์ฐ: ๋ฏธ๊ตญ, ์ ๋ฝ, ์์์์ ํ์ฌ๋ค์ ๋ถ๋์ฐ ์์ฐ์ ํ ํฐํํ๊ณ ๋ถ๋ถ ์์ ๊ถ์ ์ด์งํ๊ธฐ ์ํด NFT ์ฌ์ฉ์ ๋ชจ์ํ๊ณ ์์ต๋๋ค.
๊ณ ๊ธ ERC-721 ๊ฐ๋
ERC-721A
ERC-721A๋ ๋จ์ผ ํธ๋์ญ์ ์์ ์ฌ๋ฌ NFT๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ต์ ํํ๋ ERC-721 ํ์ค์ ๋ ๊ฐ์ค ํจ์จ์ ์ธ ๊ตฌํ์ ๋๋ค. ์ฌ๋ฌ ํ ํฐ์ ๊ฑธ์ณ ์คํ ๋ฆฌ์ง ๋น์ฉ์ ๋ถํ ์ํํ์ฌ ๊ฐ์ค ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค. ์ด๋ ๋๋์ NFT๋ฅผ ๋ฐํํ๋ ํ๋ก์ ํธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ง์ฐ ๋ฐํ(Lazy Minting)
์ง์ฐ ๋ฐํ์ NFT๊ฐ ๊ตฌ๋งค๋ ๋๋ง ๋ฐํ๋๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ๋ง์ ์์ NFT๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๋ชจ๋ ํ๋งค๋ ๊ฒ์ผ๋ก ์์ํ์ง ์๋ ํ๋ก์ ํธ์ ๊ฐ์ค ๋น์ฉ์ ์ ์ฝํ ์ ์์ต๋๋ค. NFT ๋ฉํ๋ฐ์ดํฐ๋ NFT๊ฐ ๊ตฌ๋งค๋ ๋๊น์ง ์คํ์ฒด์ธ์ ์ ์ฅ๋๋ฉฐ, ๊ทธ ์์ ์์ ํ ํฐ์ด ๋ฐํ๋๊ณ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ธ๋ก์ฒด์ธ์ ์ถ๊ฐ๋ฉ๋๋ค.
์์ธ๋ฐ์ด๋ ํ ํฐ(Soulbound Tokens)
์์ธ๋ฐ์ด๋ ํ ํฐ์ ํน์ ์ฃผ์์ ์๊ตฌ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์ ์กํ ์ ์๋ NFT์ ๋๋ค. ์ด๋ฌํ ํ ํฐ์ ํ์, ์ ๋ฌธ ์๊ฒฉ์ฆ ๋๋ ์ปค๋ฎค๋ํฐ ๋ฉค๋ฒ์ญ๊ณผ ๊ฐ์ ์๋ ๋ถ๊ฐ๋ฅํ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ `transferFrom` ํจ์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์ ํํจ์ผ๋ก์จ ๊ฐ๋ฅํด์ง๋๋ค.
ERC-721๊ณผ NFT์ ๋ฏธ๋
ERC-721 ํ์ค์ ํจ์จ์ฑ, ๋ณด์ ๋ฐ ๊ธฐ๋ฅ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ง์์ ์ธ ์ฐ๊ตฌ ๋ฐ ๊ฐ๋ฐ๊ณผ ํจ๊ป ๊ณ์ํด์ ์งํํ๊ณ ์์ต๋๋ค. ํฅํ ๊ฐ๋ฐ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ํฅ์๋ ๋ฉํ๋ฐ์ดํฐ ํ์ค: NFT์ ๊ฒ์ ๊ฐ๋ฅ์ฑ๊ณผ ์ฌ์ฉ์ฑ์ ํฅ์์ํค๊ธฐ ์ํ ๋ ํ์คํ๋๊ณ ์ํธ ์ด์ฉ ๊ฐ๋ฅํ ๋ฉํ๋ฐ์ดํฐ ํ์.
- ํฌ๋ก์ค์ฒด์ธ ์ํธ ์ด์ฉ์ฑ: NFT๊ฐ ๋ค๋ฅธ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ ๊ฐ์ ์ ์ก๋๊ณ ์ฌ์ฉ๋ ์ ์๋๋ก ํ๋ ์๋ฃจ์ .
- ๊ฐ์ ๋ ๋ณด์ ์กฐ์น: ์ทจ์ฝ์ ๋ฐ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํ ์๋ก์ด ๋ณด์ ํ๋กํ ์ฝ ๋ฐ ๋๊ตฌ.
- ์ค๋ฌผ ์์ฐ๊ณผ์ ํตํฉ: ๋ถ๋์ฐ, ์์งํ, ์ง์ ์ฌ์ฐ๊ถ๊ณผ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์์ฐ์ ์์ ๊ถ์ ๋ํ๋ด๊ธฐ ์ํ NFT์ ๊ด๋ฒ์ํ ์ฑํ.
๊ฒฐ๋ก
ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ๋ธ๋ก์ฒด์ธ์์ ๊ณ ์ ํ ๋์งํธ ๋ฐ ๋ฌผ๋ฆฌ์ ์์ฐ์ ์์ ๊ถ์ ๋ํ๋ด๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ERC-721์ ์ํคํ ์ฒ, ๊ตฌํ ์ธ๋ถ ์ ๋ณด, ๋ณด์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ํ์ ์ ์ด๊ณ ์ํฅ๋ ฅ ์๋ NFT ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. NFT ์ํ๊ณ๊ฐ ๊ณ์ ์ฑ์ฅํ๊ณ ์งํํจ์ ๋ฐ๋ผ ERC-721 ํ์ค์ ๋์งํธ ์์ ๊ถ์ ๋ฏธ๋๋ฅผ ํ์ฑํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค.
์ด ๊ฐ์ด๋๋ ERC-721 ์ค๋งํธ ๊ณ์ฝ์ ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค. ์์ ์ NFT ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ ๋๋ ํญ์ ๋ณด์์ ์ต์ฐ์ ์ผ๋ก ํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ํ์ด์ ๋น๋๋ค!